package co.edu.usbcali.lidis.vista;

import java.awt.EventQueue;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;
import org.postgresql.ds.PGPoolingDataSource;

import co.edu.usbcali.lidis.dataaccess.daoFactory.FachadaBaseDeDatos;
import co.edu.usbcali.lidis.modelo.Proyecto;
import co.edu.usbcali.lidis.modelo.Usuario;

public class PantallaPropuesta extends JFrame {

	private Text txtTituloProyecto;
	private Text txtPalClave;
	private Text txtObjGeneral;
	private Text txtObjEspecifico;
	private Text txtMarcoTeori;
	private Usuario usuario;
	private Proyecto proyect;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {

			}
		});
	}

	/**
	 * Open the window.
	 */
	public PantallaPropuesta(int idUsuario, final Proyecto proyecto) {
		System.out.println("zzzz" + idUsuario);
		Display display = Display.getDefault();
		Shell shlFormularioPropuestaDe = new Shell();
		shlFormularioPropuestaDe.setSize(572, 656);
		shlFormularioPropuestaDe
				.setText("Formulario propuesta de investigación");

		usuario = new Usuario();
		usuario.setUsuId(idUsuario);

		Button btnGuardar = new Button(shlFormularioPropuestaDe, SWT.NONE);
		btnGuardar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {

				Proyecto proyecto = new Proyecto();
				proyecto.setProTitulo(txtTituloProyecto.getText());
				proyecto.setProPalclave(txtPalClave.getText());
				proyecto.setProObjGeneral(txtObjGeneral.getText());
				proyecto.setProObjEspecificos(txtObjEspecifico.getText());
				proyecto.setProContenido(txtMarcoTeori.getText());
				proyecto.setUsuario(usuario);
				try {
					boolean guardarProyecto = FachadaBaseDeDatos.getInstance()
							.guadarProyecto(proyecto);
					if (guardarProyecto) {
						JOptionPane.showMessageDialog(null,
								"El proyecto se guardo exitosamente.", "OK",
								JOptionPane.INFORMATION_MESSAGE);
					} else {
						JOptionPane.showMessageDialog(null,
								"El proyecto no se guardo.", "Error",
								JOptionPane.ERROR_MESSAGE);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		btnGuardar.setBounds(155, 552, 75, 25);
		btnGuardar.setText("Guardar");

		Label lblTitulo = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblTitulo.setBounds(40, 159, 108, 15);
		lblTitulo.setText("Título del proyecto:");

		Label lblPalabraClave = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblPalabraClave.setBounds(40, 198, 84, 15);
		lblPalabraClave.setText("Palabras Clave:");

		Label lblObjGeneral = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblObjGeneral.setBounds(40, 247, 108, 15);
		lblObjGeneral.setText("Objetivo General:");

		Label lblObjEspecifico = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblObjEspecifico.setBounds(40, 319, 122, 15);
		lblObjEspecifico.setText("Objetivos Específicos:");

		Label lblMarcoTeori = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblMarcoTeori.setBounds(40, 409, 108, 15);
		lblMarcoTeori.setText("Marco Teórico:");

		txtTituloProyecto = new Text(shlFormularioPropuestaDe, SWT.BORDER);
		txtTituloProyecto.setBounds(181, 153, 319, 21);

		txtPalClave = new Text(shlFormularioPropuestaDe, SWT.BORDER);
		txtPalClave.setBounds(181, 192, 319, 21);

		txtObjGeneral = new Text(shlFormularioPropuestaDe, SWT.BORDER
				| SWT.WRAP | SWT.MULTI);
		txtObjGeneral.setBounds(181, 241, 319, 53);

		txtObjEspecifico = new Text(shlFormularioPropuestaDe, SWT.BORDER
				| SWT.WRAP | SWT.MULTI);
		txtObjEspecifico.setBounds(181, 316, 319, 63);

		txtMarcoTeori = new Text(shlFormularioPropuestaDe, SWT.BORDER
				| SWT.WRAP | SWT.MULTI);
		txtMarcoTeori.setBounds(181, 406, 319, 114);

		Label lblNewLabel = new Label(shlFormularioPropuestaDe, SWT.NONE);
		lblNewLabel.setImage(SWTResourceManager
				.getImage("imagenes\\encabezadoPropuesta.png"));
		lblNewLabel.setBounds(0, 0, 556, 133);

		Button btnVerRecomendaciones = new Button(shlFormularioPropuestaDe,
				SWT.NONE);
		btnVerRecomendaciones.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {

				int retornoFuncion = 0;
				Long codProyectoRecom = 0L;
				List<Long> idProyectos = new ArrayList<Long>();
				List<Proyecto> proyectosRecomendados = new ArrayList<Proyecto>();
				
				
				try {
					String palabraClave = txtPalClave.getText();
					retornoFuncion = FachadaBaseDeDatos.getInstance()
							.ejecutaModelo(palabraClave);

					if (retornoFuncion == 0) {
						System.out.println("Ejecución exitosa");
					}
					PGPoolingDataSource dataSource = new PGPoolingDataSource();
					// dataSource.setDataSourceName("DataSourcepostgres");
					dataSource.setServerName("localhost");
					dataSource.setDatabaseName("tesis");
					dataSource.setUser("postgres");
					dataSource.setPassword("P0stgressql");
					dataSource.setMaxConnections(10);

					JDBCDataModel dataModel = new PostgreSQLJDBCDataModel(
							dataSource, "RECOMENDACION", "USU_ID", "PRO_ID",
							"PUN_VALOR", null);

					// DataModel model = new FileDataModel(modelFile);

					UserSimilarity similarity = new PearsonCorrelationSimilarity(
							dataModel);
					UserNeighborhood neighborhood = new NearestNUserNeighborhood(
							2, similarity, dataModel);

					Recommender recommender = new GenericUserBasedRecommender(
							dataModel, neighborhood, similarity);

					List<RecommendedItem> recommendations = recommender
							.recommend(usuario.getUsuId(), 5);

					for (RecommendedItem recommendation : recommendations) {
						codProyectoRecom = recommendation.getItemID();
						idProyectos.add(codProyectoRecom);
						System.out.println(codProyectoRecom);
					}
					
					for (int i = 0; i < idProyectos.size(); i++) {
						Proyecto proyecto = FachadaBaseDeDatos.getInstance().consultarProyectoPorId(idProyectos.get(i));
						proyectosRecomendados.add(proyecto);
					}
					
					
					
					System.out.println(proyectosRecomendados.get(0).getProPalclave());
					
				
						PantallaRecomendacion pantallaPropuesta = new PantallaRecomendacion(proyectosRecomendados);
					
					
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
	if(idUsuario==0){
		txtTituloProyecto.setText(proyecto.getProTitulo());
		txtPalClave.setText(proyecto.getProPalclave());
		txtObjGeneral.setText(proyecto.getProObjGeneral());
		txtObjEspecifico.setText(proyecto.getProObjEspecificos());
		txtMarcoTeori.setText(proyecto.getProContenido());
	}
		btnVerRecomendaciones.setBounds(284, 552, 90, 25);
		btnVerRecomendaciones.setText("Ver Recomendación");

		shlFormularioPropuestaDe.open();
		shlFormularioPropuestaDe.layout();
		while (!shlFormularioPropuestaDe.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	private void limpiarCampos() {
		txtTituloProyecto.setText("");
		txtPalClave.setText("");
		txtObjGeneral.setText("");
		txtObjEspecifico.setText("");
		txtMarcoTeori.setText("");
	}
}
